import torch


########################
# 自动微分计算--不断调整w让损失最小化
########################


def demo():
    # 定义初始权重，随机
    w = torch.tensor(10, requires_grad=True, dtype=torch.float32)
    loss = w**2 + 20  # 定义损失函数 求导为 2w

    print(f'初始权重：{w}      初始损失：{loss}   ')

    for i in range(1,101):
        # 必须要重新设置损失函数
        loss = w**2 + 20

        # 反向传播,计算梯度，默认会将梯度累加到w.grad中 需要清零
        loss.sum().backward()
        # print(f'第{i}次迭代，梯度：{w.grad} ')
        
        # 更新权重 w新 = w旧 - 学习率 * w.grad
        w.data = w.data - 0.01 * w.grad

        print(f'第{i}次迭代，权重：{w:.5f}-----损失：{loss:.5f}-----梯度*学习率：{w.grad * 0.01:.5f} ')
        # 清零梯度
        if(w.grad is not None):
            w.grad.zero_()  


if __name__ == "__main__":
    demo()
